﻿using Autofac;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Reflection;
namespace YiSha.Admin.Web.App_Start
{
    /// <summary>
    /// 
    /// </summary>
    public class AutofacConfig : Autofac.Module
    {
        /// <summary>
        /// AutoFac注册服务
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {

            //builder.RegisterType<OneService>().As<IService>();
            //builder.RegisterType<ProductClass>();
            #region 接口注入 
            //注入订单服务 
            // builder.RegisterType<OrderServer>().Named<IOrderServer>("1");
            //注入购物车生成订单服务
            #endregion
            #region 注入指定程序集
            //注册整个程序集中的对象,需要注入的类要以Service结尾，否则注册失败
            var services = Assembly.Load("YiSha.Service");
            //指定需要注入的类名称是否包含Service，
            builder.RegisterAssemblyTypes(services).Where(w => w.Name.EndsWith("Service"))
             //生命周期：单例，返回同一个实例。
             .SingleInstance()
             //属性注入,必须配置
             .PropertiesAutowired();
            //注册整个程序集中的对象,需要注入的类要以Cache结尾，否则注册失败
            var cache = Assembly.Load("YiSha.Business.Cache");
            //指定需要注入的类名称是否包含Service，
            builder.RegisterAssemblyTypes(cache).Where(w => w.Name.EndsWith("Cache"))
             //生命周期：单例，返回同一个实例。
             .SingleInstance()
             //属性注入,必须配置
             .PropertiesAutowired();
            #endregion
            #region 注入公共类
            //注入sqlsugar
            //builder.RegisterType<SqlSugarAdapters>();
            #endregion
            //所有注入必须写在它之前
            ControllersTypesInAssembly(builder);
        }
        /// <summary>
        /// 注册所有控制器的关系及控制器实例化所需要的组件
        /// </summary>
        /// <param name="builder"></param>
        protected void ControllersTypesInAssembly(ContainerBuilder builder)
        {
            //获取所有控制器 不这样处理不能使用属性注入
            var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
               .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToList();
            //获取命名空间
            var nameSpace = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace;
            var nameSpaceArr = nameSpace.Split('.');
            //获取程序集中所有的控制器
            Assembly assembly = Assembly.Load(nameSpaceArr[0] + ".Areas.Core");
            var types = assembly.GetTypes().Where(type => typeof(ControllerBase)
            .IsAssignableFrom(type)).ToList();
            types.ForEach(f =>
            {
                controllersTypesInAssembly.Add(f);
            });
            //
            builder.RegisterTypes(controllersTypesInAssembly.ToArray())
                .PropertiesAutowired();
        }

    }
}
